'use strict'

const http = require('http');
const fs = require('fs');

/*------------------解析body数据----------------------------*/ 

/**
 * Content-Disposition:form-data;name='file';filename='xxx'
 * Content-Type:text/plain
 * @param {string} headerData 
 */

function parseBodyHeaders(headerData){
    let hlist = headerData.split('\r\n').filter(p=>p.length>0)
    
    //解析content-disposition,hlist[0]
    //按照;切分数组。选出从第二个元素开始的数组
    let csplit = hlist[0].split(';').slice(1);

    let filename
    let name
    for(let a of csplit){
        if(a.indexOf('filename=')===0){
            filename=a.substring(a.indexOf('=')+2,a.length-1)
        }else{
            name = a.substring(a.indexOf('=')+2,a.length-1)
        }
    }

    let headers = {}
    let ind=0
    let k
    for(let h of hlist){
        ind=h.indexOf(':')
        k=h.substring(0,ind).toLowerCase()
        headers[k]=h.substring(ind+1).trim();
    }
    return{
        filename,
        name,
        headers,
        contentType:headers['content-type']||''
    }
}


function parseBody(bodyData,headers){
    let ctype = headers['content-type']
    let bdy = ctype.substring(ctype.indexOf('=')+1)
    let crlf_bdy = `\r\n--${bdy}`
    let header_end_index = bodyData.indexOf('\r\n\r\n',
                                        crlf_bdy.length);
    let headerData = bodyData.toString('utf8',crlf_bdy.length,
                                        header_end_index);

    
    //解析文件头信息
    let hd= parseBodyHeaders(headerData)

    let file = {
        start:header_end_index+4,
        end:bodyData.indexOf(crlf_bdy,header_end_index),
        ...hd
    }
    file.length = file.end-file.start
    return file
}



/*------------------解析body数据-end----------------------------*/ 

let html = `
    <!DOCTYPE html>
    <html>
        <head> 
            <title>First HTTP</title>
        </head>
        <body>
            你好
        </body>
    </html>
`
/*
    .jpg  .jepg->image/jepg
    .png->image/png
    .gif->image/x-icon
    .txt->text/plain
    .json->text/json 或 application/json
    .xml->text/xml 或 application/xml
*/ 

let routerTable = {

    
GET:{
    '/':async (req,res)=>{
        res.setHeader('content-type','text/html;charset=utf-8')
        res.end(html)
    },
    '/test':async (req,res) =>{
        let status = parseInt(Math.random()*200)+199
        res.statusCode=status
        res.end('test end');
    },

    '/upload':async(req,res)=>{
        let stm = fs.createReadStream('./upload.html');
        stm.pipe(res,{end:false});
        stm.on('end',()=>{
            res.end();
        })
    },
},
POST:{   
         '/data': async (req,res)=>{
        let bufferList = [];
        let bufferLength = 0;
        req.on('data',chunk=>{
            bufferLength+=chunk.length;
            bufferList.push(chunk)
        })
        let bodyData=null;
        req.on('end',()=>{
            if(bufferList.length>0){
                bodyData=Buffer.concat(bufferList,bufferLength);
                bufferList=[];
            }
            let file=parseBody(bodyData,req.headers)
            console.log(file)
            parseBody(bodyData,req.headers)
            if(bodyData){
                res.end(bodyData)
            }else{
                res.end();
            }
        })
    }
},
}


http.createServer((req,res)=>{
    let rm = routerTable[req.method]
   if(!rm[req.url] || !rm){
        res.statusCode=404
        res.end('page not found')
        return
   }
   rm[req.url](req,res);
    
}).listen(3456);